home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / file.s < prev    next >
Text File  |  1999-02-27  |  19KB  |  801 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        ファイル入出力
  4. ;        < file.s >
  5. ;
  6. ;    $Id: file.s,v 1.4  1999  2/27(Sat) 23:41:32 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    DOSCALL.MAC
  13.     .include    has.equ
  14.     .include    tmpcode.equ
  15.     .include    error2.equ
  16.  
  17.     .cpu    68000
  18.     .text
  19.  
  20.  
  21. ;----------------------------------------------------------------
  22. ;    ファイル管理ルーチン
  23. ;----------------------------------------------------------------
  24.  
  25. ;----------------------------------------------------------------
  26. ;    ファイルを読み込みモードでオープンする
  27. ;    in :a0=ファイル名へのポインタ /INPFILPTR=入力ファイルポインタへのポインタ
  28. ;    out:d0.w=オープンしたファイルハンドル(エラーなら負の数)
  29. readopen::
  30.     move.l    a0,(INPFILE,a6)
  31.     move.l    a1,-(sp)
  32.     movea.l    (INPFILPTR,a6),a1
  33.     clr.w    -(sp)            ;'r'
  34.     pea.l    (a0)
  35.     DOS    _OPEN
  36.     addq.l    #6,sp
  37.     move.w    d0,(F_HANDLE,a1)
  38.     move.l    a0,(F_NAMEPTR,a1)
  39.     clr.l    (F_TOPOFST,a1)
  40.     clr.l    (F_DATALEN,a1)
  41.     clr.l    (F_PTROFST,a1)
  42.     move.l    (sp)+,a1
  43.     rts
  44.  
  45. ;----------------------------------------------------------------
  46. ;    ファイルを新たに作成する(実際には準備をするだけ)
  47. ;    in :a0=ファイル名へのポインタ /OUTFILPTR=出力ファイルポインタへのポインタ
  48. ;    out:---
  49. createopen::
  50.     move.l    a1,-(sp)
  51.     movea.l    (OUTFILPTR,a6),a1
  52.     move.l    a0,(F_NAMEPTR,a1)
  53.     clr.l    (F_TOPOFST,a1)
  54.     clr.l    (F_DATALEN,a1)
  55.     clr.l    (F_PTROFST,a1)
  56.     move.w    #-1,(F_HANDLE,a1)    ;ファイルはまだ実際に作られていない
  57.     move.l    (sp)+,a1
  58.     rts
  59.  
  60. ;----------------------------------------------------------------
  61. ;    出力ファイル(PRNファイルなど)をオープンする
  62. ;    in :a0=ファイル名へのポインタ
  63. ;    out:d0.w=オープンしたファイルハンドル(エラーなら負の数)
  64. prnopen::
  65.     move.w    #$20,-(sp)        ;ファイル属性(Archive)
  66.     pea.l    (a0)
  67.     DOS    _CREATE            ;ファイルを作成する
  68.     addq.l    #6,sp
  69.     tst.l    d0
  70.     bpl    prnopen9
  71.     move.w    #1,-(sp)        ;書き込みモード
  72.     pea.l    (a0)
  73.     DOS    _OPEN            ;(_CREATEだとCONなどのオープンができないから)
  74.     addq.l    #6,sp
  75.     tst.l    d0
  76.     bmi    filopenabort        ;ファイルオープンに失敗
  77.     move.w    d0,-(sp)
  78.     clr.w    -(sp)
  79.     DOS    _IOCTRL
  80.     addq.l    #2,sp
  81.     btst.l    #1,d0
  82.     beq    prnopen8
  83.     st.b    (ISPRNSTDOUT,a6)    ;オープンしたファイルは標準出力
  84.     st.b    (NOPAGEFF,a6)
  85.     DOS    _CLOSE
  86.     move.w    #STDOUT,(sp)
  87. prnopen8:
  88.     move.w    (sp)+,d0
  89. prnopen9:
  90.     rts
  91.  
  92. ;----------------------------------------------------------------
  93. ;    入力ファイルをクローズする
  94. ;    in :---
  95. ;    out:---
  96. inpclose::
  97.     move.l    a1,-(sp)
  98.     movea.l    (INPFILPTR,a6),a1
  99.     move.w    (F_HANDLE,a1),-(sp)
  100.     DOS    _CLOSE
  101.     addq.l    #2,sp
  102.     move.l    (sp)+,a1
  103.     rts
  104.  
  105. ;----------------------------------------------------------------
  106. ;    出力ファイルをクローズする
  107. ;    in :---
  108. ;    out:---
  109. outclose::
  110.     move.l    a1,-(sp)
  111.     movea.l    (OUTFILPTR,a6),a1
  112.     bsr    writebuf        ;ファイルバッファをフラッシュする
  113.     move.w    (F_HANDLE,a1),-(sp)
  114.     DOS    _CLOSE
  115.     addq.l    #2,sp
  116.     move.l    (sp)+,a1
  117.     rts
  118.  
  119. ;----------------------------------------------------------------
  120. ;    インクルードファイルをオープンする
  121. ;    in :a0=ファイル名へのポインタ
  122. ;    out:d0.w=オープンできたら0
  123. openincld::
  124.     cmpi.w    #INCLDMAXNEST,(INCLDNEST,a6)
  125.     bcc    tooinclderr        ;ネスティングが深すぎる
  126.     movem.l    a0-a2,-(sp)
  127.     lea.l    (INCLDPTR,a6),a1    ;インクルードファイルポインタ
  128.     lea.l    (INCLDINF,a6),a2
  129.     tst.w    (INCLDNEST,a6)
  130.     beq    openincld1
  131.     movea.l    (INCLDINFPTR,a6),a2    ;2重以上のネスティングの場合
  132.     move.l    (F_TOPOFST,a1),d0
  133.     add.l    (F_PTROFST,a1),d0    ;ファイルポインタ位置を得る
  134.     move.l    d0,(a2)+
  135.     move.l    (F_NAMEPTR,a1),(a2)+
  136.     move.w    (F_HANDLE,a1),-(sp)
  137.     DOS    _CLOSE            ;ファイルをクローズする
  138.     addq.l    #2,sp
  139. openincld1:
  140.     move.l    (LINENUM,a6),(a2)+
  141.     move.l    a2,(INCLDINFPTR,a6)
  142.     move.l    a1,(INPFILPTR,a6)    ;入力ファイルを切り替える
  143.     bsr    readopen
  144.     clr.l    (LINENUM,a6)
  145.     addq.w    #1,(INCLDNEST,a6)
  146.     tst.w    d0
  147.     bmi    openincld9
  148.     moveq.l    #0,d0
  149.     movem.l    (sp)+,a0-a2
  150.     rts
  151.  
  152. openincld9:                ;ファイルオープンに失敗
  153.     bsr    closeincld
  154.     moveq.l    #-1,d0
  155.     movem.l    (sp)+,a0-a2
  156.     rts
  157.  
  158. ;----------------------------------------------------------------
  159. ;    インクルードファイルをクローズする
  160. ;    in :---
  161. ;    out:---
  162. closeincld::
  163.     movem.l    d0/a0-a2,-(sp)
  164.     lea.l    (INCLDPTR,a6),a1
  165.     move.w    (F_HANDLE,a1),-(sp)
  166.     DOS    _CLOSE            ;ファイルをクローズする
  167.     addq.l    #2,sp
  168.     movea.l    (INCLDINFPTR,a6),a2
  169.     move.l    -(a2),(LINENUM,a6)
  170.     subq.w    #1,(INCLDNEST,a6)
  171.     beq    closeincld1        ;元のソースファイルに戻った
  172.     move.l    -(a2),a0
  173.     bsr    readopen        ;1つ前のインクルードファイルをオープンする
  174.     move.l    -(a2),(F_TOPOFST,a1)
  175.     clr.w    -(sp)
  176.     move.l    (a2),-(sp)
  177.     move.w    (F_HANDLE,a1),-(sp)
  178.     DOS    _SEEK            ;それまでの読み込み位置までシークする
  179.     addq.l    #8,sp
  180.     clr.l    (F_DATALEN,a1)
  181.     bsr    readbuf            ;ファイルバッファの内容をもとに戻す
  182.     move.l    a2,(INCLDINFPTR,a6)
  183.     movem.l    (sp)+,d0/a0-a2
  184.     rts
  185.  
  186. closeincld1:                ;元のソースファイルに戻ってきた
  187.     move.l    a2,(INCLDINFPTR,a6)
  188.     lea.l    (SOURCEPTR,a6),a0
  189.     move.l    a0,(INPFILPTR,a6)
  190.     move.l    (SOURCEFILE,a6),(INPFILE,a6)
  191.     movem.l    (sp)+,d0/a0-a2
  192.     rts
  193.  
  194. ;----------------------------------------------------------------
  195. ;    指定されたインクルードファイルを検索する
  196. ;    in :a0=ファイル名へのポインタ
  197. ;    out:d0.w=0ならファイルが見つかった/a0=見つかったファイル名へのポインタ(パス名付き)
  198. srchincld::
  199.     link    a5,#-128
  200.     movem.l    a1-a3,-(sp)
  201.     movea.l    a0,a2
  202.     lea.l    (-128,a5),a0        ;カレントディレクトリからファイルを検索する
  203.     bsr    srchinclds
  204.     tst.l    d0
  205.     beq    srchincld7
  206.     lea.l    (INCLUDEPATH,a6),a3    ;-i path からファイルを検索する
  207. srchincld1:
  208.     move.l    (a3),d0
  209.     beq    srchincld2
  210.     movea.l    d0,a3
  211.     lea.l    (4,a3),a1
  212.     lea.l    (-128,a5),a0
  213.     bsr    pathcpy
  214.     bsr    srchinclds
  215.     tst.l    d0
  216.     beq    srchincld7
  217.     bra    srchincld1        ;次の'-i'パスを検索する
  218.  
  219. srchincld2:
  220.     lea.l    (-128,a5),a0        ;環境変数'include'のパスからファイルを検索する
  221.     movea.l    a0,a1
  222.     pea.l    (a0)
  223.     clr.l    -(sp)
  224.     pea.l    (env_incld,pc)
  225.     bsr    getenv            ;DOS _GETENV
  226.     lea.l    (12,sp),sp
  227.     tst.l    d0
  228.     bmi    srchincld6        ;環境変数が設定されていない
  229.     bsr    pathcpy
  230.     bsr    srchinclds
  231.     tst.l    d0
  232.     beq    srchincld7
  233. srchincld6:                ;ファイルが見つからなかった
  234.     moveq.l    #-1,d0
  235.     bra    srchincld9
  236.  
  237. srchincld7:                ;ファイルが見つかった
  238.     movea.l    (TEMPPTR,a6),a0
  239.     movea.l    a0,a1
  240.     lea.l    (-128,a5),a2
  241. srchincld8:
  242.     move.b    (a2)+,(a1)+
  243.     bne    srchincld8
  244.     move.l    a1,(TEMPPTR,a6)
  245.     bsr    memcheck
  246.     moveq.l    #0,d0
  247. srchincld9:
  248.     movem.l    (sp)+,a1-a3
  249.     unlk    a5
  250.     rts
  251.  
  252. srchinclds:                ;ファイルがあるかどうかをチェック
  253.     movea.l    a2,a1
  254.     bsr    strcpy            ;ファイル名を転送
  255.     clr.w    -(sp)
  256.     pea.l    (-128,a5)
  257.     DOS    _OPEN            ;オープンしてみる
  258.     addq.l    #6,sp
  259.     tst.l    d0
  260.     bmi    srchinclds2        ;ファイルがない
  261.     move.w    d0,-(sp)
  262.     DOS    _CLOSE            ;ファイルがあったのでクローズする
  263.     addq.l    #2,sp
  264.     moveq.l    #0,d0
  265. srchinclds2:
  266.     rts
  267.  
  268. ;----------------------------------------------------------------
  269. ;    テンポラリファイル名を作成する
  270. ;    in :---
  271. ;    out:a0=作成したファイル名へのポインタ
  272. maketmpname::
  273.     move.l    a1,-(sp)
  274.     movea.l    (TEMPPTR,a6),a0
  275.     movem.l    d0-d2/a0,-(sp)
  276.     movea.l    (TEMPPATH,a6),a1
  277.     tst.b    (a1)
  278.     bne    maketmpname2        ;/tの指定があった場合
  279.     movea.l    a0,a1
  280.     pea.l    (a0)
  281.     clr.l    -(sp)
  282.     pea.l    (env_temp,pc)
  283.     bsr    getenv            ;DOS _GETENV
  284.                     ;環境変数'temp'の内容を読み出す
  285.     lea.l    (12,sp),sp
  286.     tst.l    d0
  287.     bmi    maketmpname25        ;環境変数'temp'が定義されていない
  288. maketmpname2:
  289.     bsr    pathcpy
  290. maketmpname25:
  291.     lea.l    (temp_name,pc),a1
  292.     bsr    strcpy            ;テンポラリファイル名を転送
  293.     addq.l    #1,a0
  294.     move.l    a0,(TEMPPTR,a6)
  295.     subq.l    #8,a0
  296.     movea.l    a0,a1            ;'000'の位置
  297.     moveq.l    #0,d2
  298. maketmpname3:
  299.     movea.l    a1,a0
  300.     move.l    d2,d0
  301.     moveq.l    #-3,d1            ;(3桁でゼロサプレスしない)
  302.     bsr    convdec
  303.     clr.w    -(sp)
  304.     move.l    (14,sp),-(sp)        ;a0
  305.     DOS    _OPEN            ;オープンしてみる
  306.     addq.l    #6,sp
  307.     tst.l    d0
  308.     bmi    maketmpname9        ;ファイルがないのでテンポラリファイルとして使用
  309.     move.w    d0,-(sp)
  310.     DOS    _CLOSE
  311.     addq.l    #2,sp
  312.     addq.w    #1,d2
  313.     cmpi.w    #1000,d2
  314.     bcs    maketmpname3        ;次の名前があるかどうか探す
  315.     bra    tmpopenabort        ;テンポラリファイル名が作成できない
  316.  
  317. maketmpname9:
  318.     movem.l    (sp)+,d0-d2/a0-a1
  319.     rts
  320.  
  321. env_incld:
  322.     .dc.b    'include',0
  323. env_temp:
  324.     .dc.b    'temp',0
  325. temp_name:
  326.     .dc.b    'tmp000.$$$',0
  327.     .even
  328.  
  329. ;----------------------------------------------------------------
  330. ;    オブジェクトバッファに1ロングワードのデータを出力する
  331. ;    in :d0.l=書き込みデータ
  332. ;    out:---
  333. wrt1lobj::
  334.     swap.w    d0
  335.     bsr    wrt1wobj
  336.     swap.w    d0
  337.  
  338. ;----------------------------------------------------------------
  339. ;    オブジェクトバッファに1ワードのデータを出力する
  340. ;    in :d0.w=書き込みデータ
  341. ;    out:---
  342. wrt1wobj::
  343.     move.w    d0,-(sp)
  344.     lsr.w    #8,d0
  345.     bsr    wrt1bobj
  346.     move.w    (sp)+,d0
  347.  
  348. ;----------------------------------------------------------------
  349. ;    オブジェクトバッファに1バイトのデータを出力する
  350. ;    in :d0.b=書き込みデータ
  351. ;    out:---
  352. wrt1bobj::
  353.     addq.l    #1,(LOCATION,a6)
  354. wrt1bobj0::                ;(ロケーションカウンタは変更しない)
  355.     tst.b    (ISOBJOUT,a6)
  356.     bne    wrt1bobj9
  357.     movem.l    d1/a0,-(sp)
  358.     move.w    (OBJCONCTR,a6),d1
  359.     cmp.w    #$0100,d1
  360.     bcs    wrt1bobj1
  361.     bsr    flushobj
  362.     clr.w    d1
  363. wrt1bobj1:
  364.     lea.l    (OBJCONBUF,a6),a0
  365.     move.b    d0,(a0,d1.w)
  366.     addq.w    #1,(OBJCONCTR,a6)
  367.     movem.l    (sp)+,d1/a0
  368. wrt1bobj9:
  369.     rts
  370.  
  371. ;----------------------------------------------------------------
  372. ;    オブジェクトバッファをフラッシュ後、必要なら出力ファイルへデータを書き込む
  373. ;    in :d0.w=書き込みデータ
  374. ;    out:---
  375. wrtobjd0w::
  376.     tst.b    (ISOBJOUT,a6)
  377.     bne    wrtobjd0w1
  378.     bsr    flushobj
  379.     bra    tmpwrtd0w
  380.  
  381. wrtobjd0w1:
  382.     rts
  383.  
  384. ;----------------------------------------------------------------
  385. ;    必要なら出力ファイルへデータを書き込む
  386. ;    in :d0.l=書き込みデータ
  387. ;    out:---
  388. wrtd0l::
  389.     swap.w    d0
  390.     bsr    wrtd0w
  391.     swap.w    d0
  392.  
  393. ;----------------------------------------------------------------
  394. ;    必要なら出力ファイルへデータを書き込む
  395. ;    in :d0.w=書き込みデータ
  396. ;    out:---
  397. wrtd0w::
  398.     tst.b    (ISOBJOUT,a6)
  399.     bne    wrtobjd0w1
  400.  
  401. ;----------------------------------------------------------------
  402. ;    出力ファイルへデータを書き込む
  403. ;    in :d0.w=書き込みデータ
  404. ;    out:---
  405. tmpwrtd0w:
  406.     movem.l    d0/a1,-(sp)
  407.     movea.l    (OUTFILPTR,a6),a1
  408.     move.l    (F_PTROFST,a1),d0
  409.     cmp.l    (F_BUFLEN,a1),d0
  410.     bcs    tmpwrtd0w1
  411.     bsr    writebuf        ;バッファがいっぱいになったので書き出す
  412.     moveq.l    #0,d0            ;(F_PTROFST,a1)
  413. tmpwrtd0w1:
  414.     add.l    (F_BUFPTR,a1),d0
  415.     addq.l    #2,(F_PTROFST,a1)
  416.     addq.l    #2,(F_DATALEN,a1)
  417.     movea.l    d0,a1
  418.     move.w    (2,sp),(a1)
  419.     movem.l    (sp)+,d0/a1
  420.     addq.l    #2,(OBJLENCTR,a6)    ;オブジェクトファイル長
  421.     rts
  422.  
  423. ;----------------------------------------------------------------
  424. ;    テンポラリファイルからデータを読み込む
  425. ;    in :---
  426. ;    out:d0.l=読み込みデータ
  427. tmpreadd0l::
  428.     bsr    tmpreadd0w
  429.     move.w    d0,-(sp)
  430.     bsr    tmpreadd0w
  431.     swap.w    d0
  432.     move.w    (sp)+,d0
  433.     swap.w    d0
  434.     rts
  435.  
  436. ;----------------------------------------------------------------
  437. ;    テンポラリファイルからデータを読み込む
  438. ;    in :---
  439. ;    out:d0.w=読み込みデータ
  440. tmpreadd0w::
  441.     move.l    a1,-(sp)
  442.     move.l    (F_PTROFST+TEMPFILPTR,a6),d0
  443.     cmp.l    (F_DATALEN+TEMPFILPTR,a6),d0
  444.     bcs    tmpreadd0w1
  445.     lea.l    (TEMPFILPTR,a6),a1
  446.     bsr    readbuf            ;バッファが空なので読み出す
  447.     subq.l    #1,d0
  448.     bmi    tmpreadd0w9        ;エラー発生/ファイルが終了
  449.     moveq.l    #0,d0            ;(F_PTROFST,a1)
  450. tmpreadd0w1:
  451.     add.l    (F_BUFPTR+TEMPFILPTR,a6),d0
  452.     addq.l    #2,(F_PTROFST+TEMPFILPTR,a6)
  453.     movea.l    d0,a1
  454.     move.w    (a1),d0
  455. tmpreadd0w9:
  456.     move.l    (sp)+,a1
  457.     rts
  458.  
  459. ;----------------------------------------------------------------
  460. ;    オブジェクトバッファをフラッシュする
  461. ;    in :---
  462. ;    out:---
  463. flushobj::
  464.     movem.l    d0-d1/a0,-(sp)
  465.     move.w    (OBJCONCTR,a6),d0
  466.     beq    flushobj2        ;バッファが空
  467.     move.w    d0,d1
  468.     subq.w    #1,d0
  469.     or.w    #T_CONST,d0
  470.     bsr    tmpwrtd0w
  471.     lea.l    (OBJCONBUF,a6),a0
  472. flushobj1:
  473.     move.w    (a0)+,d0
  474.     bsr    tmpwrtd0w
  475.     subq.w    #2,d1
  476.     bhi    flushobj1
  477.     clr.w    (OBJCONCTR,a6)
  478. flushobj2:
  479.     movem.l    (sp)+,d0-d1/a0
  480.     rts
  481.  
  482. ;----------------------------------------------------------------
  483. ;    ファイルバッファへデータを読み込む
  484. ;    in :a1=ファイルポインタへのポインタ
  485. ;    out:d0.l=実際に読み込んだバイト数(エラーなら負の数)
  486. readbuf:
  487.     move.l    (F_DATALEN,a1),d0
  488.     add.l    d0,(F_TOPOFST,a1)
  489.     move.l    (F_BUFLEN,a1),-(sp)    ;読み込みサイズ
  490.     move.l    (F_BUFPTR,a1),-(sp)    ;ファイルバッファへのポインタ
  491.     move.w    (F_HANDLE,a1),-(sp)    ;ファイルハンドル
  492.     DOS    _READ
  493.     lea.l    (10,sp),sp
  494.     move.l    d0,(F_DATALEN,a1)
  495.     clr.l    (F_PTROFST,a1)
  496.     rts
  497.  
  498. ;----------------------------------------------------------------
  499. ;    ファイルバッファ内のデータを書き込む
  500. ;    in :a1=ファイルポインタへのポインタ
  501. ;    out:--- (エラーならプログラムを中断する)
  502. writebuf::
  503.     move.l    d0,-(sp)
  504.     tst.l    (F_PTROFST,a1)
  505.     beq    writebuf9        ;ファイルバッファが空
  506.     tst.w    (F_HANDLE,a1)
  507.     bpl    writebuf8        ;ファイルはすでに作成されている
  508.     move.w    #$20,-(sp)        ;ファイル属性(Archive)
  509.     move.l    (F_NAMEPTR,a1),-(sp)
  510.     DOS    _CREATE            ;最初の書き込みならファイルを作成する
  511.     addq.l    #6,sp
  512.     tst.l    d0
  513.     bpl    writebuf1
  514.     lea.l    (TEMPFILPTR,a6),a0
  515.     cmpa.l    a0,a1            ;ファイルオープンに失敗
  516.     beq    tmpopenabort
  517.     movea.l    (F_NAMEPTR,a1),a0
  518.     bra    filopenabort
  519.  
  520. writebuf1:
  521.     move.w    d0,(F_HANDLE,a1)
  522. writebuf8:
  523.     move.l    (F_PTROFST,a1),-(sp)    ;バッファ内の有効データ長
  524.     move.l    (F_BUFPTR,a1),-(sp)    ;ファイルバッファへのポインタ
  525.     move.w    (F_HANDLE,a1),-(sp)    ;ファイルハンドル
  526.     DOS    _WRITE
  527.     lea.l    (10,sp),sp
  528.     cmp.l    (F_PTROFST,a1),d0
  529.     bne    devfulabort        ;書き込みに失敗した
  530.     add.l    d0,(F_TOPOFST,a1)
  531.     clr.l    (F_PTROFST,a1)
  532.     clr.l    (F_DATALEN,a1)
  533. writebuf9:
  534.     move.l    (sp)+,d0
  535.     rts
  536.  
  537. ;----------------------------------------------------------------
  538. ;    テンポラリファイルのポインタを進める
  539. ;    in :d0.w=進めるバイト数
  540. ;    out:---
  541. tempskip::
  542.     ext.l    d0
  543. tempskip1:
  544.     add.l    (F_PTROFST+TEMPFILPTR,a6),d0
  545.     cmp.l    (F_DATALEN+TEMPFILPTR,a6),d0
  546.     bcs    tempskip9
  547.     sub.l    (F_DATALEN+TEMPFILPTR,a6),d0
  548.     movem.l    d0/a1,-(sp)
  549.     lea.l    (TEMPFILPTR,a6),a1
  550.     bsr    readbuf            ;進めたポインタがバッファからはみだした
  551.     movem.l    (sp)+,d1/a1
  552.     exg.l    d0,d1
  553.     subq.l    #1,d1
  554.     bpl    tempskip1
  555. tempskip9:
  556.     move.l    d0,(F_PTROFST+TEMPFILPTR,a6)
  557.     rts
  558.  
  559. ;----------------------------------------------------------------
  560. ;    ファイルを修正する(書き込み専用)
  561. fmodifyw::
  562.     cmp.l    (F_TOPOFST,a1),d1
  563.     blo    fmodifyw1
  564. ;バッファに残っているとき
  565.     movem.l    d1/a1,-(sp)
  566.     sub.l    (F_TOPOFST,a1),d1
  567.     movea.l    (F_BUFPTR,a1),a1
  568.     move.w    d0,(a1,d1.l)
  569.     movem.l    (sp)+,d1/a1
  570.     rts
  571.  
  572. ;バッファに残っていないとき
  573. fmodifyw1:
  574.     move.l    d0,-(sp)
  575.  
  576.     clr.w    -(sp)
  577.     move.l    d1,-(sp)
  578.     move.w    (F_HANDLE,a1),-(sp)
  579.     DOS    _SEEK            ;修正位置まで移動
  580.     addq.l    #8,sp
  581.  
  582.     pea.l    2.w
  583.     pea.l    (6,sp)            ;(修正データの位置)
  584.     move.w    (F_HANDLE,a1),-(sp)
  585.     DOS    _WRITE            ;ファイルを修正
  586.     lea.l    (10,sp),sp
  587.  
  588.     clr.w    -(sp)
  589.     move.l    (F_TOPOFST,a1),-(sp)
  590.     move.w    (F_HANDLE,a1),-(sp)
  591.     DOS    _SEEK            ;もとの位置まで戻る
  592.     addq.l    #8,sp
  593.  
  594.     move.l    (sp)+,d0
  595.     rts
  596.  
  597. ;----------------------------------------------------------------
  598. ;    ファイルを修正する
  599. ;    in :a1=ファイルポインタへのポインタ
  600. ;        d0.w=修正データ/d1.l=修正するファイル位置
  601. ;    out:---
  602. fmodify::
  603.     tst.w    (F_HANDLE,a1)
  604.     bpl    fmodify1
  605.     move.l    a1,-(sp)
  606.     movea.l    (F_BUFPTR,a1),a1    ;ファイルが作られていないのでバッファ内を修正する
  607.     move.w    d0,(a1,d1.l)
  608.     movea.l    (sp)+,a1
  609.     rts
  610.  
  611. fmodify1:                ;実際のファイル内を修正する
  612.     move.l    d0,-(sp)
  613.     clr.w    -(sp)
  614.     move.l    d1,-(sp)
  615.     move.w    (F_HANDLE,a1),-(sp)
  616.     DOS    _SEEK            ;修正位置まで移動
  617.     addq.l    #8,sp
  618.  
  619.     pea.l    2.w
  620.     pea.l    (6,sp)            ;(修正データの位置)
  621.     move.w    (F_HANDLE,a1),-(sp)
  622.     DOS    _WRITE            ;ファイルを修正
  623.     lea.l    (10,sp),sp
  624.  
  625.     clr.w    -(sp)
  626.     move.l    (F_TOPOFST,a1),d0
  627.     add.l    (F_DATALEN,a1),d0
  628.     move.l    d0,-(sp)
  629.     move.w    (F_HANDLE,a1),-(sp)
  630.     DOS    _SEEK            ;もとの位置まで戻る
  631.     addq.l    #8,sp
  632.     move.l    (sp)+,d0
  633.     rts
  634.  
  635. ;----------------------------------------------------------------
  636. ;    テンポラリファイルを削除する
  637. ;    in :---
  638. ;    out:---
  639. tempdelete::
  640.     movem.l    d0/a1,-(sp)
  641.     lea.l    (TEMPFILPTR,a6),a1
  642.     tst.w    (F_HANDLE,a1)
  643.     bmi    tempdelete9        ;ファイルが作られていないので削除の必要なし
  644.     move.w    (F_HANDLE,a1),-(sp)
  645.     DOS    _CLOSE            ;テンポラリファイルをクローズ
  646.     addq.l    #2,sp
  647.     move.l    (F_NAMEPTR,a1),-(sp)
  648.     DOS    _DELETE            ;クローズしたファイルを削除する
  649.     addq.l    #4,sp
  650. tempdelete9:
  651.     movem.l    (sp)+,d0/a1
  652.     rts
  653.  
  654. ;----------------------------------------------------------------
  655. ;    ファイルバッファをフラッシュする
  656. ;    in :a1=ファイルポインタへのポインタ
  657. ;    out:---
  658. fflush::
  659.     tst.w    (F_HANDLE,a1)
  660.     bpl    writebuf        ;ファイルバッファをフラッシュ
  661.     rts                ;ファイルが作られていないのでフラッシュの必要なし
  662.  
  663. ;----------------------------------------------------------------
  664. ;    ファイルの先頭にシークする
  665. ;    in :a1=ファイルポインタへのポインタ
  666. ;    out:---
  667. frewind::
  668.     move.l    d0,-(sp)
  669.     tst.w    (F_HANDLE,a1)
  670.     bmi    frewind1        ;ファイルは実際には作られていない
  671.     tst.l    (F_TOPOFST,a1)
  672.     beq    frewind1        ;読み込みファイルがバッファ内に収まっている
  673.     clr.w    -(sp)
  674.     clr.l    -(sp)
  675.     move.w    (F_HANDLE,a1),-(sp)
  676.     DOS    _SEEK            ;ファイル先頭にシーク
  677.     addq.l    #8,sp
  678.     clr.l    (F_DATALEN,a1)        ;バッファ内のデータを無効にする
  679. frewind1:
  680.     clr.l    (F_TOPOFST,a1)
  681.     clr.l    (F_PTROFST,a1)
  682.     move.l    (sp)+,d0
  683.     rts
  684.  
  685. ;----------------------------------------------------------------
  686. ;    ソース行を1行読み込む
  687. ;    in :---
  688. ;    out:(LINEBUF~)=入力行
  689. ;        d0.w=入力行が 0:ソースファイルから/1:インクルードファイルから/2:マクロ展開
  690. ;         (ファイルが終了/エラーなら -1)
  691. getline::
  692. getline0:
  693.     tst.b    (ISASMEND,a6)
  694.     bne    getline9        ;ソースファイルは終了済
  695.     tst.w    (MACREPTNEST,a6)
  696.     bne    getline2
  697.     addq.l    #1,(LINENUM,a6)
  698.     tst.w    (INCLDNEST,a6)
  699.     beq    readline
  700.  
  701.     bsr    readline        ;インクルードファイルからの読み込み
  702.     tst.w    d0
  703.     bmi    getline1
  704.     moveq.l    #1,d0
  705.     rts
  706.  
  707. getline1:                ;インクルードファイルが終了した
  708.     bsr    closeincld
  709.     cmpi.b    #1,(ASMPASS,a6)
  710.     bne    getline0
  711.     move.w    #T_INCLDEND,d0
  712.     bsr    wrtobjd0w
  713.     bra    getline0
  714.  
  715. getline2:                ;マクロ定義行/rept繰り返し部の読み込み
  716.     bsr    macexline
  717.     tst.w    d0
  718.     bmi    getline0
  719.     moveq.l    #2,d0
  720.     rts
  721.  
  722. getline9:
  723.     moveq.l    #-1,d0
  724.     rts
  725.  
  726. ;----------------------------------------------------------------
  727. ;    ファイルから1行読み込む
  728. ;    in :---
  729. ;    out:(LINEBUF~)=入力行 /d0.l=エラーなら負の数
  730. readline:
  731.     movem.l    d1-d3/a0-a2,-(sp)
  732.     lea.l    (LINEBUF,a6),a0
  733.     move.l    a0,(LINEPTR,a6)
  734.     movea.l    (INPFILPTR,a6),a1
  735.     movea.l    (F_BUFPTR,a1),a2
  736.     move.l    (F_PTROFST,a1),d3
  737.     move.l    (F_DATALEN,a1),d2
  738.     adda.l    d3,a2
  739.     move.l    d2,d1
  740.     sub.l    d3,d1
  741.     addq.l    #1,d1
  742.     move.w    #MAXLINELEN-2,d3
  743. readline1:
  744.     subq.l    #1,d1
  745.     bhi    readline2
  746.     bsr    readbuf            ;バッファが空なので読み込む
  747.     subq.l    #1,d0
  748.     bmi    readline8
  749.     move.l    (F_DATALEN,a1),d1
  750.     move.l    d1,d2
  751.     movea.l    (F_BUFPTR,a1),a2
  752. readline2:
  753.     move.b    (a2)+,d0
  754.     cmp.b    #CR,d0
  755.     beq    readline3        ;CRは読み飛ばす
  756.     cmp.b    #LF,d0
  757.     beq    readline5
  758.     cmp.b    #EOF,d0
  759.     beq    readline4
  760.     move.b    d0,(a0)+
  761. readline3:
  762.     dbra    d3,readline1
  763.     bra    readline5        ;1行が最大長を超えた
  764.  
  765. readline4:                ;EOF
  766.     cmp.w    #MAXLINELEN-2,d3
  767.     beq    readline8        ;行頭のEOFならそこでファイル終了
  768. readline5:                ;LF
  769.     clr.b    (a0)
  770.     moveq.l    #0,d0
  771. readline9:
  772.     subq.l    #1,d1
  773.     sub.l    d1,d2
  774.     move.l    d2,(F_PTROFST,a1)
  775.     movem.l    (sp)+,d1-d3/a0-a2
  776.     rts
  777.  
  778. readline8:                ;エラー/ファイルの終了
  779.     moveq.l    #-1,d0
  780.     bra    readline9
  781.  
  782.  
  783. ;----------------------------------------------------------------
  784.     .end
  785.  
  786. ;----------------------------------------------------------------
  787. ;    $Log: file.s,v $
  788. ;    Revision 1.4  1999  2/27(Sat) 23:41:32 M.Kamada
  789. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  790. ;
  791. ;    Revision 1.3  1997  9/28(Sun) 19:19:13 M.Kamada
  792. ;    +49 includeをカレント→スイッチ→環境変数の順序に変更
  793. ;
  794. ;    Revision 1.2  1997  9/14(Sun) 16:28:23 M.Kamada
  795. ;    +46 error.sを分離
  796. ;
  797. ;    Revision 1.1  1994/02/15  12:21:10  nakamura
  798. ;    Initial revision
  799. ;
  800. ;
  801.